package com.gobang.modules.game;

import com.gobang.modules.message.MsgHandler;
import com.gobang.modules.message.MessageService;
import com.gobang.modules.player.PlayerService;
import com.gobang.proto.GameProto.*;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 游戏控制器
 * 处理游戏相关的消息
 */
@Slf4j
@Component
public class GameController {

    @Autowired
    private GameService gameService;
    @Autowired
    private MessageService messageService;
    @Autowired
    private PlayerService playerService;

    /**
     * 处理落子请求
     * 服务器从会话中获取 userId 和 roomId，不信任客户端数据
     * 注意：登录验证已在 WebSocketHandler 中统一处理，此处无需再验证
     */
    @MsgHandler(MessageType.PLACE_PIECE)
    public void onPlacePiece(ChannelHandlerContext ctx, PlacePieceRequest request) {
        // 1. 从 Channel 获取真实用户ID（已在 WebSocketHandler 验证过登录状态）
        Long userId = playerService.getUserId(ctx);

        // 2. 获取玩家实际所在的房间ID
        String roomId = gameService.getPlayerRoomId(userId);
        if (roomId == null) {
            PlacePieceResponse response = PlacePieceResponse.newBuilder()
                    .setSuccess(false)
                    .setMessage("您当前不在任何游戏中")
                    .build();
            messageService.sendMessage(ctx, MessageType.PLACE_PIECE_RESPONSE, response.toByteArray());
            log.warn("玩家不在游戏中: userId={}", userId);
            return;
        }

        // 3. 使用服务器权威数据处理落子请求
        gameService.handlePlacePiece(roomId, userId, request.getRow(), request.getCol());
    }

    /**
     * 处理投降请求
     * 服务器从会话中获取 userId 和 roomId，不信任客户端数据
     * 注意：登录验证已在 WebSocketHandler 中统一处理，此处无需再验证
     */
    @MsgHandler(MessageType.SURRENDER)
    public void onSurrender(ChannelHandlerContext ctx, SurrenderRequest request) {
        // 1. 从 Channel 获取真实用户ID（已在 WebSocketHandler 验证过登录状态）
        Long userId = playerService.getUserId(ctx);

        // 2. 获取玩家实际所在的房间ID
        String roomId = gameService.getPlayerRoomId(userId);
        if (roomId == null) {
            SurrenderResponse response = SurrenderResponse.newBuilder()
                    .setSuccess(false)
                    .setMessage("您当前不在任何游戏中")
                    .build();
            messageService.sendMessage(ctx, MessageType.SURRENDER_RESPONSE, response.toByteArray());
            log.warn("玩家不在游戏中: userId={}", userId);
            return;
        }

        // 3. 验证通过，发送投降响应
        SurrenderResponse response = SurrenderResponse.newBuilder()
                .setSuccess(true)
                .setMessage("投降成功")
                .build();
        messageService.sendMessage(ctx, MessageType.SURRENDER_RESPONSE, response.toByteArray());
        
        // 4. 使用服务器权威数据处理投降
        gameService.handleSurrender(roomId, userId);
    }
}
